﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace CryptFighter
{
    // Clase base para definir un Sprite cualquiera
    class Sprite
    {
        // Creamos un nuevo vector de dirección 2D (Vector2)
        // para posicionar el nuevo Sprite en pantalla, las
        // coordenadas X y Y empiezan en la esquina superior
        // izquierda de nuestro Viewport o pantalla
        public Vector2 spritePosition = new Vector2(0, 0);

        // Creamos una nueva textura para almacenar la imagen
        // del Sprite que se creará, la textura en este caso la
        // definimos tambien como publica para heredar mas tarde
        // de esta misma clase los diferentes personajes
        public Texture2D spriteTexture;

        // Nombre de la textura del Sprite
        public string AssetName;

        // Tamaño del Sprite (del tipo "Rectangle")
        public Rectangle Size;

        // Incremento/decremento de la escala del Sprite
        private float mScale = 1.0f;

        
        // La siguiente función se utiliza para escalar el Sprite,
        // se modifica Size respeto a la escala que le demos
        public float Scale
        {
            get
            {
                return mScale;
            }
            set
            {
                mScale = value;
                Size = new Rectangle(0, 0, (int)(spriteTexture.Width * Scale), (int)(spriteTexture.Height * Scale));
            }
        }


        // Como la clase Sprite no tiene un gestor de contenido
        // necesita pedir uno, en este caso vendrá dado cuando se
        // llama a la función, a eso debemos los parámetros de entrada:
        // content será el ContentManager que le especifiquemos y
        // spriteFile el nombre del archivo/imagen del Sprite a cargar
        public void LoadContent(ContentManager mContentManager, string spriteFile)
        {
            // Con esto le decimos que en la variable creada con
            // anterioridad nos cargue un tipo Texture2D a través
            // del gestor de contenido, el archivo será el que le
            // hayamos dado al llamar a la función LoadContent en
            // el argumento "spriteFile"
            spriteTexture = mContentManager.Load<Texture2D>(spriteFile);
            AssetName = spriteFile;
            // Guardamos un "Rectangle" con las dimensiones de la imagen
            // para facilitar el escalado si es necesario
            Size = new Rectangle(0, 0, (int)(spriteTexture.Width * Scale), (int)(spriteTexture.Height * Scale));
        }


        // Añadimos un control para la posición del Sprite a lo largo
        // del tiempo, especificando la velocidad y vector de dirección
        public void Update(GameTime gameTime, Vector2 spriteSpeed, Vector2 spriteDirection)
        {
            spritePosition += spriteDirection * spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;
        }


        // Dibujamos en pantalla el contenido ya cargado, aclarar
        // que "LoadContent" no genera nada en pantalla, simplemente
        // almacena en memoria el contenido que el programa va a usar
        public void Draw(SpriteBatch mSpriteBatch)
        {
            // Al igual que sucede con LoadContent, no cargamos directamente
            // un nuevo SpriteBatch, sino que pedimos que nos pasen uno ya
            // creado como argumento para tal de generar los Sprites que
            // estamos cargando a traves de la clase Sprite en si
            Color dColor = Color.White;
            float dIndex = 0;
            Draw(mSpriteBatch, dColor, dIndex);
        }
        // Los argumentos mColor y mIndex son opcionales, nos permiten controlar
        // el color/transición y el indice del Sprite (nivel de profundidad)
        public void Draw(SpriteBatch mSpriteBatch, Color mColor, float mIndex)
        {
            // En orden: Textura, Posicion, Tamaño (del rectangulo, bordes),
            // Color, Rotación, Posición inicial, Escala, Efectos, Indice de la capa
            mSpriteBatch.Draw(spriteTexture, spritePosition, Size, mColor, 0.0f, Vector2.Zero, Scale, SpriteEffects.None, mIndex);
        }
    }
}